iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
佛心分享-IT 人自學之術

C++探險家系列 第 20

Day 20 類別續集概念

  • 分享至 

  • xImage
  •  

今天會說明到static成員、friend函式、類別、繼承所有概念且跟生活中的例子做結合比較好理解

## static成員

  • 概念:
    1.static成員屬於類別本身,而非個別的物件。
    2.所有的物件共享同一個static成員。
    3.static成員在程式開始執行時就被初始化,且生命週期等同於整個程式。
  • 用途:
    1.記錄全域狀態:** 可以用來記錄整個類別的狀態,例如,計算一個類別的物件總數。
    2.常數:** 可以用來儲存一些常數,例如,圓周率。
  • 生活中的例子:
    1.一間公司的總員工數:無論有多少員工,公司只有一個總員工數,這個總員工數就是static成員。
    2.圓周率:圓周率是一個常數,無論計算多少個圓的周長,圓周率的值都是相同的。

## friend函式/friend類別

  • 概念:
    1.friend函式/friend類別可以存取類別的private和protected成員。
    2.它們不是類別的成員,但被類別授予了特殊權限。
  • 用途:
    1.提供便利的存取:** 當需要在類別外部存取私有成員時,可以宣告一個friend函式。
    2.實現非對稱的關係:** 有時,兩個類別之間需要緊密合作,但又不希望建立繼承關係,此時可以使用friend關係。
  • 生活中的例子:
    1.醫生和病患:** 醫生可以查看病患的私密病歷,但病患不一定能查看醫生的所有資訊。
    2.朋友之間的關係:** 朋友之間可以互相分享私密的事情,但並不代表他們是同一個人。
    ## 繼承
  • 概念:
    1.繼承是一種建立新類別的方式,新類別會繼承基類的屬性和方法。
    2.子類可以新增自己的屬性和方法,也可以覆寫基類的方法。
  • 用途:
    1.代碼重用:** 子類可以重用基類的代碼,避免重複寫相同的程式碼。
    2.建立類別層次結構:** 可以建立一個類別的層次結構,反映現實世界的類別關係。
  • 生活中的例子:
    1.動物:** 貓、狗都是動物,它們繼承了動物的共同特徵(如吃、睡),同時又有各自的特徵(貓會喵喵叫,狗會汪汪叫)。
    2.車輛:** 汽車、摩托車都是車輛,它們繼承了車輛的共同特徵(如輪子、引擎),同時又有各自的特徵(汽車有四個輪子,摩托車有兩個輪子)。
    ## 繼承的重點概念
    1.public繼承:子類可以公開繼承基類的所有public成員。
    2.protected繼承:子類可以存取基類的protected和public成員。
    3.private繼承:子類只能存取基類的private成員,但不能直接使用,需要透過基類的public或protected成員函式來間接存取。
    4.虛函式:虛函式允許子類覆寫基類的方法,實現多型。
    ## 注意事項
    1.friend機制:過度使用friend機制會破壞封裝性,降低程式碼的可維護性。
    2.繼承的濫用:繼承是一種強大的工具,但濫用繼承會導致類別層次結構過於複雜,不易理解和維護。

實作練習:

#include <iostream>
using namespace std;

// 基底類別 Vehicle (車輛)
class Vehicle {
public:
    string brand;
    int year;

    Vehicle(string b, int y) : brand(b), year(y) {}

    // 顯示車輛基本資訊
    void display() {
        cout << "車輛品牌: " << brand << ", 製造年份: " << year << endl;
    }
};

// 子類別 Sedan 繼承自 Vehicle
class Sedan : public Vehicle {
public:
    int numDoors;

    // 使用父類別的建構子,並初始化子類別的成員變數
    Sedan(string b, int y, int d) : Vehicle(b, y), numDoors(d) {}

    // 顯示 Sedan 的詳細資訊
    void display() {
        Vehicle::display();  // 呼叫父類別的 display 方法
        cout << "車門數: " << numDoors << endl;
    }

    // Sedan 專屬的功能
    void sedanFeature() {
        cout << brand << " 這台轎車的專屬功能是: 配有高級皮椅" << endl;
    }
};

// 子類別 SUV 繼承自 Vehicle
class SUV : public Vehicle {
public:
    bool hasFourWheelDrive;

    // 使用父類別的建構子,並初始化子類別的成員變數
    SUV(string b, int y, bool fwd) : Vehicle(b, y), hasFourWheelDrive(fwd) {}

    // 顯示 SUV 的詳細資訊
    void display() {
        Vehicle::display();  // 呼叫父類別的 display 方法
        cout << "是否有四輪驅動: " << (hasFourWheelDrive ? "是" : "否") << endl;
    }

    // SUV 專屬的功能
    void suvFeature() {
        cout << brand << " 這台 SUV 的專屬功能是: 配有越野模式" << endl;
    }
};

// 主函數
int main() {
    Sedan mySedan("Toyota", 2020, 4);
    SUV mySUV("Jeep", 2022, true);

    cout << "轎車的資訊:" << endl;
    mySedan.display();       // 顯示 Sedan 的資訊
    mySedan.sedanFeature();   // 呼叫轎車專屬功能

    cout << "\nSUV 的資訊:" << endl;
    mySUV.display();         // 顯示 SUV 的資訊
    mySUV.suvFeature();      // 呼叫 SUV 專屬功能

    return 0;
}

此題使用物件導向程式設計的功能(如繼承和多態性)來管理不同類型的車輛資訊,並提供相應的功能。

!!今天的內容是跟著第一次學C++就上手第二版第14章後半段一起跟著做學習的!!


上一篇
Day 19 類別
下一篇
Day 21 排序與搜尋
系列文
C++探險家30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言